#include <head.h>

#define BUFFER_SIZE 1024

void copy_file(char const *file_dest, char const *file_src, off_t start, off_t end)
{
    size_t bytes = 0;
    char buf[BUFFER_SIZE];

    // 打开文件
    int fd_dest = open(file_dest, O_RDWR | O_CREAT | O_TRUNC, 0666); //写文件
    if (-1 == fd_dest)
    {
        perror("open error:");
        exit(EXIT_FAILURE);
    }

    int fd_src = open(file_src, O_RDONLY); // 源文件
    if (-1 == fd_src)
    {
        perror("open error:");
        exit(EXIT_FAILURE);
    }

    // 定位到源文件读取位置
    lseek(fd_dest, start, SEEK_SET);

    // 写入文件
    while ((bytes = read(fd_src, buf, BUFFER_SIZE)) > 0)
    {
        write(fd_dest, buf, bytes);
    }

    close(fd_dest);
    close(fd_src);
}

int main(int argc, char const *argv[])
{
    if (3 != argc)
    {
        printf("格式错误 : %s file_dest file_src\n", argv[0]);
        exit(1);
    }

    off_t file_size;
    struct stat st;
    stat(argv[1], &st);
    file_size = st.st_size;

    pid_t child_pid_1, child_pid_2;
    off_t middle = file_size / 2;

    // 第一个子进程
    child_pid_1 = fork();
    if (child_pid_1 < 0)
    {
        perror("fork error");
        exit(EXIT_FAILURE);
    }

    if (child_pid_1 == 0)
    {
        // 子进程1拷贝文件的上半部分
        copy_file(argv[1], argv[2], 0, middle);
    }
    else
    {
        // 父进程创建第二个子进程
        child_pid_2 = fork();
        if (child_pid_2 < 0)
        {
            perror("fork error");
            exit(EXIT_FAILURE);
        }

        if (child_pid_2 == 0)
        {
            // 子进程2拷贝文件的下半部分
            copy_file(argv[1], argv[2], middle, 0);
        }
        else
        {
            // 父进程等待两个子进程完成
            wait(NULL);
            wait(NULL);
        }
    }

    return 0;
}